package com.me.study.javaCore.reflection;

import com.me.common.pojo.Point;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Reflection：通过反射技术操作类的属性
 * 作者     JSD1402班
 * 时间     上午9:44:05
 */
public class FieldReflect {
	public static void main(String[] args) {
		//获取类的Class实例
		Class<?> c = Point.class;
		//获取类的所有公开属性
		Field[] fields = c.getFields();
		System.out.println("===所有公开属性如下===");
		if (fields.length == 0) {
			System.out.println("没有公开的属性!");
			System.out.println("===所有属性如下===");
			Field[] fields2 = c.getDeclaredFields();
			for (Field f : fields2) {
				//系统输出方法
				//System.out.println(f);
				//System.out.println(f.toString());
				//System.out.println(f.toGenericString());

				//自己定义输出
				System.out.println(Modifier.toString(f.getModifiers()) + " "
						+ f.getType() + " " + f.getName());
			}
		} else {
			for (Field f : fields) {
				System.out.println(f);
			}
		}

		System.out.println("---反射获取和修改属性---");

		//获取某一个指定名字的属性
		try {
			//获取指定属性的Filed对象
			Field field = c.getDeclaredField("x");
			//通过反射创建对象
			Point point = (Point) c.newInstance();
			//通过属性对象获取属性的值
			//如果不修改权限,则抛出非法权限异常,所以,在访问私有属性前一定要先修改权限
			field.setAccessible(true);
			System.out.println("修改前: x = " + field.get(point));
			//通过反射修改属性值
			field.set(point, 10);
			System.out.println("修改后: x = " + field.get(point));
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
}
